home *** CD-ROM | disk | FTP | other *** search
- To: warlord@MIT.EDU (Derek Atkins)
- In-reply-to: warlord@MIT.EDU's message of 1 Mar 1993 03:59:41 GMT
- Subject: Request for Mailer Scripts
- BCC: jtkohl
- Full-name: John T Kohl
- X-US-Snail: DEC, 110 Spit Brook Road, M/S ZKO3-3/U14, Nashua, NH 03062
- --text follows this line--
- here's some elisp I got from Bill Sommerfeld, and hacked up a bit
- myself:
- ;;;
- ;;; wrapper for the "Pretty-Good-Privacy" program.
- ;;;
-
- (defvar pgp-program (expand-file-name "/usr/local/bin/pgp")
- "*Name of the PGP executable")
- (defvar pgp-sender-name "jtkohl@zk3"
- "*Name of secret key to use for signing/encrypting messages with PGP")
-
- (require 'rmail)
- (require 'terminal)
- (require 'backquote)
-
- (defvar pgp-encrypt-mail t)
- (defvar pgp-sign-mail t)
- (defvar pgp-output-mode-map nil
- "Keymap used in PGP Output mode")
-
- (defvar pgp-finished)
- (make-variable-buffer-local 'pgp-finished)
- (set-default 'pgp-finished nil)
- (defvar termhook-finished)
- (make-variable-buffer-local 'termhook-finished)
- (set-default 'termhook-finished nil)
-
- (defun pgp-output-quit ()
- (interactive)
- (let ((buffer (current-buffer)))
- (switch-to-buffer
- (if (and (boundp 'pgp-prev-buffer) (bufferp pgp-prev-buffer))
- pgp-prev-buffer
- (other-buffer buffer)))
- (bury-buffer buffer)))
-
- (defun pgp-keymap-init ()
- (setq pgp-output-mode-map (make-keymap))
- (suppress-keymap pgp-output-mode-map)
- (define-key pgp-output-mode-map " " 'scroll-up)
- (define-key pgp-output-mode-map "\177" 'scroll-down)
- (define-key pgp-output-mode-map "q" 'pgp-output-quit))
-
- (if (not pgp-output-mode-map)
- (pgp-keymap-init))
-
- (defun pgp-output-mode ()
- (interactive)
- (fundamental-mode)
- (setq mode-name "PGP-Output")
- (setq major-mode 'pgp-output-mode)
- (setq buffer-read-only t)
- (setq buffer-auto-save-file-name nil)
- (use-local-map pgp-output-mode-map))
-
-
- ;; a "continuation".. what we do after pgp is done..
- ;; this could set the current buffer (the terminal emulator one)
- ;; into a new major mode (pgp-after-mode) to let you do things like:
- ;; a) easily dismiss the pgp window
- ;; b) view any output files.
- ;; c) see what the "labelling" on the files was
- ;; (i.e., signature, encrypted); this shows up in mode line, not file!
-
- (defun pgp-continue-frob (out-filename prev-buffer)
- (cond ((file-exists-p out-filename)
- (set-buffer (get-buffer-create "*PGP Output*"))
- (make-variable-buffer-local 'pgp-prev-buffer)
- (setq pgp-prev-buffer nil)
- (setq buffer-read-only nil)
- (erase-buffer)
- (insert-file-contents out-filename)
- (delete-file out-filename)
- (switch-to-buffer "*PGP Output*")
- (pgp-output-mode)
- (setq pgp-prev-buffer prev-buffer))
- (t (message "PGP command completed with no output file" ))))
-
- (defun pgp-continue-in-place (out-file buf min max cont)
- (cond ((file-exists-p out-file)
- (switch-to-buffer buf)
- (goto-char min)
- (delete-region min max)
- (insert-file-contents out-file)
- (delete-file out-file)
- (apply cont nil))
- (t (message "PGP command completed with no output file"))))
-
- (defun pgp-mail-continue ()
- (mail-to)
- (insert (save-excursion
- (set-buffer "*PGP*") ;!!!
- (goto-char (point-min))
- (re-search-forward "Recipient's")
- (re-search-forward "user ID: \\(.*$\\)")
- (buffer-substring (match-beginning 1) (match-end 1)))))
-
- (defvar pgp-base-file-name nil
- "Default base file name for PGP temp files; defaults to a file in
- /tmp with your UNIX user id in it.")
-
- (defun pgp-check-tempname ()
- (if pgp-base-file-name
- ()
- (setq pgp-base-file-name (format "/tmp/pgp%d" (user-real-uid)))))
-
- (defun pgp-frob-region-1 (min max cont1 &optional opt1 opt2)
- (pgp-check-tempname)
- (let ((temp-filename (format "%s.txt" pgp-base-file-name))
- (out-filename (format "%s.asc" pgp-base-file-name))
- (prev-buffer (current-buffer)))
- (if (file-exists-p temp-filename)
- (delete-file temp-filename))
- (if (file-exists-p out-filename)
- (delete-file out-filename))
- (write-region min max temp-filename)
-
- (let ((buf (get-buffer-create "*PGP*")))
- (switch-to-buffer buf)
- (erase-buffer)
- (let ((terminal-mode-hook
- (function
- (lambda ()
- (make-variable-buffer-local 'terminal-finished-hook)
- (setq terminal-finished-hook (apply cont1 out-filename prev-buffer nil))
- (setq termhook-finished t)
- (if (and
- (boundp 'pgp-finished)
- pgp-finished)
- (let ((nhooks terminal-finished-hook))
- (fundamental-mode) ; in the *PGP* buffer; nukes hooks!
- (run-hooks 'nhooks)))))))
- (terminal-emulator buf
- pgp-program
- (nconc (list "-o" out-filename)
- opt1
- (list temp-filename)
- opt2))))))
-
- (defun pgp-frob-region (min max &optional opt1 opt2)
- (pgp-frob-region-1 min max
- (function
- (lambda (out-filename buf)
- (` (lambda ()
- (pgp-continue-frob
- (, out-filename)
- (, buf))))))
- opt1 opt2))
-
- (defun pgp-frob-region-in-place (min max &optional opt1 opt2 cont)
- (let ((cur-buf (current-buffer)))
- (pgp-frob-region-1 min max
- (function
- (lambda (out-filename buf)
- (` (lambda ()
- (pgp-continue-in-place (, out-filename)
- (, cur-buf)
- (, min)
- (, max)
- (quote (, cont)))))))
- opt1 opt2)))
-
- (defun pgp-encrypt-ascii-region (min max to)
- (interactive "r\nsRecipient name: ")
- (pgp-frob-region min max (list "-eaw") (list to)))
-
- (defun pgp-decrypt-ascii-region (min max)
- (interactive "r")
- (pgp-frob-region min max nil nil))
-
- (defun pgp-sign-ascii-region (min max)
- "Sign the region with PGP, using cleartext signatures."
- (interactive "r")
- (pgp-frob-region min max (list "-swat") nil))
-
- (defun pgp-encrypt-ascii-buffer (to)
- "Encrypt a buffer and use PGP armor for the output."
- (interactive "sRecipient name: ")
- (pgp-encrypt-ascii-region (point-min) (point-max) to))
-
- (defun pgp-decrypt-ascii-buffer ()
- "Apply PGP to the current buffer."
- (interactive)
- (pgp-decrypt-ascii-region (point-min) (point-max)))
-
- (defun pgp-sign-encrypt-ascii-buffer (to)
- (interactive "sRecipient name: ")
- (pgp-frob-region (point-min) (point-max) (list "-seaw") (list to)))
-
- (defun pgp-sign-ascii-buffer ()
- "Sign the current buffer with PGP, using cleartext signatures."
- (interactive)
- (pgp-sign-ascii-region (point-min) (point-max)))
-
- (defun pgp-sign-encrypt-ascii-buffer-in-place (to)
- (interactive "s(in place) Recipient name: ")
- (pgp-frob-region-in-place (point-min) (point-max) (list "-seaw") (list to)))
-
- (defun pgp-sign-encrypt-ascii-region (min max to)
- (interactive "r\nsRecipient name: ")
- (pgp-frob-region min max (list "-seaw") (list to)))
-
- (defvar pgp-mail-frob-flags "-easw"
- "*Flags to pass to pgp for frobbing mail.")
-
- (defun pgp-frob-mail (to)
- "Take an in-progress mail message and 'frob' it."
- (interactive "sMail Recipient name: ")
- (goto-char (point-min))
- (re-search-forward mail-header-separator)
- (goto-char (match-beginning 0))
- (forward-line 1)
- (save-excursion
- (insert (buffer-substring (point-min) (point))))
- (pgp-frob-region-in-place (point) (point-max)
- (list pgp-mail-frob-flags "-u" pgp-sender-name)
- (list to)
- 'pgp-mail-continue))
-
- (global-set-key "\C-c\C-p\C-e" 'pgp-encrypt-ascii-buffer)
- (global-set-key "\C-c\C-p\C-r" 'pgp-encrypt-ascii-region)
- (global-set-key "\C-c\C-p\C-s" 'pgp-sign-ascii-buffer)
- (global-set-key "\C-c\C-p\C-m" 'pgp-frob-mail)
- (global-set-key "\C-c\C-p\C-d" 'pgp-decrypt-ascii-buffer)
-
- (global-set-key "\C-cpm" 'pgp-frob-mail)
- (define-key rmail-mode-map "V" 'pgp-decrypt-ascii-buffer)
-
- ;;; How to deal with the race? the sentinel may get called
- ;;; *before* terminal-emulator finishes its initialization. So we set
- ;;; up a local variable here so that our terminal-mode-hook will undo
- ;;; the damage if PGP is finished.
- ;;
- ;; from terminal.el, modified:
-
- (defun te-sentinel (process message)
- (cond ((eq (process-status process) 'run))
- ((null (buffer-name (process-buffer process)))) ;deleted
- (t (let ((b (current-buffer))
- (done-hooks (and ; added: WES
- (boundp 'terminal-finished-hook)
- terminal-finished-hook)))
- (save-excursion
- (set-buffer (process-buffer process))
- (setq buffer-read-only nil)
- (goto-char (point-max))
- (delete-blank-lines)
- (delete-horizontal-space)
- (insert "\n*******\n" message "*******\n")
- (fundamental-mode) ; added/moved: WES/JTK
- (setq pgp-finished t) ; JTK
- (sit-for 1))
- (if (and (eq b (process-buffer process))
- (waiting-for-user-input-p))
- (progn (goto-char (point-max))
- (recenter -1)))
- (run-hooks 'done-hooks))))) ;added: WES
-
-
-